"""
Case Type   : 故障&可靠性测试
Case Name   : switchover后，新主节点执行备份，-h 指定新备节点
Create At   : 2020/11/30
Owner       : @zou_jialiang0505328126
Description :
    1.主备切换
    2.新主节点执行备份，-h指令新备节点
    3.使用备份文件恢复主机
    4.主备切换
Expect      :
    1.主备切换成功
    2.备份成功
    3.恢复成功
    4.主备切换成功
History     :
    modified by:@wan005 修改执行恢复节点由主节点换位备节点
"""

import os
import unittest
import sys
from yat.test import macro
from yat.test import Node

sys.path.append(sys.path[0] + "/../")
from testcase.utils.CommonSH import *
from testcase.utils.Common import Common
from testcase.utils.Constant import Constant
from testcase.utils.Logger import Logger


class Basebackup(unittest.TestCase):
    commonshpri = CommonSH('PrimaryDbUser')
    commonshsta = CommonSH('Standby1DbUser')
    commonshsta2 = CommonSH('Standby2DbUser')
    nodes_tuple = ('PrimaryDbUser', 'Standby1DbUser', 'Standby2DbUser')

    @RestartDbCluster(*nodes_tuple)
    def setUp(self):
        self.log = Logger()
        self.log.info('------------Opengauss_Reliability_Tools_Backup_Case010.py 开始执行------------')
        self.dbPrimaryDbUser = Node(node='PrimaryDbUser')
        self.dbStandby1DbUser = Node(node='Standby1DbUser')
        self.dbStandby2DbUser = Node(node='Standby2DbUser')
        self.dbStandby1Root = Node(node='Standby1Root')
        self.dbPrimaryRootNode = Node(node='PrimaryRoot')
        self.Constant = Constant()
        self.common = Common('PrimaryRoot')
        self.backup_file = os.path.join(macro.DB_BACKUP_PATH, 'backup_dir')
        self.standby_hostname = self.dbStandby1DbUser.sh('hostname').result()
        self.primary_hostname = self.dbPrimaryRootNode.sh('hostname').result()

        self.log.info('-------------------创建备份路径-----------------------------------')
        shell_cmd = f'rm -rf {self.backup_file}; mkdir {self.backup_file};'
        self.log.info(shell_cmd)
        result = self.dbPrimaryDbUser.sh(shell_cmd).result()
        self.log.info(result)

    def test_backup(self):
        self.log.info("---------------1.主备切换：成功---------------------")
        result = self.commonshsta.executeGsctl('switchover', self.Constant.SWITCHOVER_SUCCESS_MSG)
        self.assertTrue(result)
        result = self.commonshsta.exec_refresh_conf()
        self.assertTrue(result)

        self.log.info('--------------------2.新主节点执行备份，-h指定新备节点：成功----------------------------')
        result = self.commonshsta.execu_gs_backup('backup', self.primary_hostname, self.backup_file, "--all")
        self.assertIn(self.Constant.BACKUP_BACKUP_SUCCESS_MSG, result)
        cmd = f'ls -l {self.backup_file} |grep "^-"|wc -l'
        self.log.info(cmd)
        result = self.dbPrimaryDbUser.sh(cmd).result()
        self.log.info(result)
        self.assertLess(0, int(result))

        self.log.info('------------------3.使用备份文件恢复主机:成功-----------------------------------')
        result = self.commonshsta.execu_gs_backup('restore', self.primary_hostname, self.backup_file, "--all")
        self.assertIn(self.Constant.BACKUP_RESTORE_SUCCESS_MSG, result)

        self.log.info('-------------------4.主备切换:成功------------------------')
        time.sleep(10)
        result = self.commonshpri.executeGsctl('switchover', self.Constant.SWITCHOVER_SUCCESS_MSG)
        self.assertTrue(result)
        result = self.commonshpri.exec_refresh_conf()
        self.assertTrue(result)

    def tearDown(self):
        self.log.info('-------------------------环境清理------------------------')
        self.log.info('--------------------------删除备份文件------------------')
        shell_cmd = f'rm -rf {self.backup_file}'
        self.log.info(shell_cmd)
        result = self.dbPrimaryDbUser.sh(shell_cmd).result()
        self.log.info(result)
        result = self.dbStandby1DbUser.sh(shell_cmd).result()
        self.log.info(result)
        result = self.dbStandby2DbUser.sh(shell_cmd).result()
        self.log.info(result)

        self.log.info('--------------------------恢复主备关系------------------------')
        result = self.commonshpri.check_whether_need_switch(self.primary_hostname)
        if result:
            self.commonshpri.executeGsctl('switchover', self.Constant.SWITCHOVER_SUCCESS_MSG)
            self.commonshpri.exec_refresh_conf()
        self.log.info('----------Opengauss_Reliability_Tools_Backup_Case010.py 执行结束-----------------------')
